package com.lfy.kcat.user.business.impl;

import cn.hutool.core.util.RandomUtil;
import com.lfy.kcat.user.business.VerifyCodeBizService;

/**
 * @author leifengyang
 * @version 1.0
 * @date 2025/9/16 10:34
 * @description:
 */

import com.lfy.kcat.user.consts.BizConst;
import com.lfy.kcat.user.consts.RedisConst;
import com.lfy.kcat.user.template.SmsTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeBizServiceImpl implements VerifyCodeBizService {


    @Autowired
    StringRedisTemplate redisTemplate;

    @Autowired
    SmsTemplate smsTemplate;

    @Override
    public void sendCode(String phone) {
        // 发送验证码
        //1、生成一个随机数的验证码
        String code = RandomUtil.randomNumbers(6);

        //2、发送验证码
        smsTemplate.sendSmsCode(phone,code);

        //3、保存手机号和验证码的关系； 保存 5min（验证码的过期时间）
        redisTemplate.opsForValue().set(
            RedisConst.PHONE_CODE_KEY+phone,code,
            BizConst.DEFAULT_CODE_EXPIRES,
            TimeUnit.SECONDS);

    }

    @Override
    public boolean verifyCode(String phone, String code) {
        //1、去redis查询验证码，验证码过期或者没有都返回null
        String redisCode = redisTemplate.opsForValue()
            .get(RedisConst.PHONE_CODE_KEY + phone);

        //2、redis直接删除这个验证码；
        //1）、【常用逻辑】验证码通过就删除（5min内，可以一直尝试验证码）
        //2）、【信创等保要求】验证码验证过就删除

        boolean equals = code.equals(redisCode);
        if (equals) {
            redisTemplate.delete(RedisConst.PHONE_CODE_KEY + phone);
        }

        return code.equals(redisCode);
    }
}
